package de.fhffm.gaertnerei.gui;
/**
 * @author Riad Hassani & Julian Schmücker & Kerim Septa
 */

import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.NoResultException;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

import de.fhffm.gaertnerei.exceptions.EingabeException;
import de.fhffm.gaertnerei.tabellen.Mitarbeiter;

@SuppressWarnings("serial")
public class LoginFenster extends JFrame implements ActionListener {
 
	private JButton buttonAnmelden = new JButton("Anmelden");
	private JButton buttonAbbrechen = new JButton("Abbrechen");
	
	private JTextField textfeldBenutzer = new JTextField(8);
	
	private JPasswordField passwortfeldPasswort = new JPasswordField(8);
	
	private JLabel labelUeberschrift = new JLabel ("Chili-Datenbank");
	private JLabel labelBenutzer = new JLabel("Benutzername:");
	private JLabel labelPasswort = new JLabel("Passwort:");
	
	private JPanel panelUeberschrift = new JPanel();
	private JPanel panelEingabe = new JPanel();
	private JPanel panelButtons = new JPanel();
	
	private String benutzername = null;
	private String passwort = null;
	
	public LoginFenster(){

		ereignissensorenAnmeldung();
		erstelleFenster();

	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		
		Object obj = e.getSource();
		
		if(obj == buttonAnmelden){
			
			if(hohleUndPruefeEingabe()){
				new HauptFenster(benutzername);
				dispose();
				
			}else{
				System.out.println("Fehler bei der Eingabe aufgetreten!");
			}
			
		}
		
		if(obj == buttonAbbrechen){
			dispose();
			System.exit(0);
		}
	}

	private void erstelleFenster() {
		
		setTitle("Login");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		bestandteileAnordnen();
		pack();	
		setLocationRelativeTo(null);
		setVisible(true);
		setResizable(false);
}

	private void bestandteileAnordnen(){
		
		GroupLayout loginFensterLayout = new GroupLayout(getContentPane());
		getContentPane().setLayout(loginFensterLayout);
		
		loginFensterLayout.setAutoCreateGaps(true);
		loginFensterLayout.setAutoCreateContainerGaps(true);
		
	
		loginFensterLayout.setVerticalGroup(loginFensterLayout.createSequentialGroup().
				addComponent(panelUeberschrift).
				addComponent(panelEingabe).
				addComponent(panelButtons)
		);
		
		loginFensterLayout.setHorizontalGroup(loginFensterLayout.createParallelGroup().
				addComponent(panelUeberschrift).
				addComponent(panelEingabe).
				addComponent(panelButtons)
		);		
		
		panelUeberschriftAnordnen();
		panelEingabeAnordnen();
		panelButtonsAnordnen();
	}
		
	private void panelUeberschriftAnordnen(){
		
		panelUeberschrift.setLayout(new FlowLayout());
		panelUeberschrift.add(labelUeberschrift);
		labelUeberschrift.setFont(new Font("Times new Roman", Font.BOLD, 22));
	}
	
	private void panelEingabeAnordnen(){
		
		GroupLayout eingabePanelLayout = new GroupLayout(panelEingabe);
		panelEingabe.setLayout(eingabePanelLayout);
		
		eingabePanelLayout.setAutoCreateGaps(true);
		eingabePanelLayout.setAutoCreateContainerGaps(true);
		
		eingabePanelLayout.setVerticalGroup(eingabePanelLayout.createSequentialGroup( ).
					addGroup(eingabePanelLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).
						addComponent( labelBenutzer ).
						addComponent( textfeldBenutzer )
			).
			  		addGroup(eingabePanelLayout.createParallelGroup( GroupLayout.Alignment.BASELINE ).
			  			addComponent( labelPasswort ).
			  			addComponent( passwortfeldPasswort )));
						
		eingabePanelLayout.setHorizontalGroup(eingabePanelLayout.createParallelGroup( ).addGroup(eingabePanelLayout.createSequentialGroup( ).
					addGroup( eingabePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false ).
						addComponent( labelBenutzer, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( labelPasswort,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE )
						).
					addGroup( eingabePanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false ).
						addComponent( textfeldBenutzer, GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ).
						addComponent( passwortfeldPasswort,GroupLayout.DEFAULT_SIZE,GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE )
						)));
			
	}
	
	private void panelButtonsAnordnen(){
		
		GroupLayout buttonPanelLayout = new GroupLayout(panelButtons);
		panelButtons.setLayout(buttonPanelLayout);
		
		buttonPanelLayout.setAutoCreateGaps(true);
		buttonPanelLayout.setAutoCreateContainerGaps(true);
		
		buttonPanelLayout.setVerticalGroup(buttonPanelLayout.createSequentialGroup().
				addGroup(buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE).
						addComponent(buttonAnmelden).
						addComponent(buttonAbbrechen)
				)
		);
		
		buttonPanelLayout.setHorizontalGroup(buttonPanelLayout.createSequentialGroup().
				addGroup(buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false).
						addComponent(buttonAnmelden, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
				).
				addGroup(buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false).
						addComponent(buttonAbbrechen, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
				)
		);
	}
	
	private void ereignissensorenAnmeldung(){
		
		buttonAnmelden.addActionListener(this);
		buttonAbbrechen.addActionListener(this);
	}

	private boolean hohleUndPruefeEingabe() {
	
		boolean pruefe = false;
		hohleEingabe();

		try{
			pruefe = pruefeEingabe();
		}catch (EingabeException e){
			System.out.println("Eingabe Fehler!");
		}
		
		return pruefe;
		
	}

	private void hohleEingabe() {
		
		this.benutzername = textfeldBenutzer.getText();
		this.passwort = String.valueOf(passwortfeldPasswort.getPassword());
		
	}

	private boolean pruefeEingabe() throws EingabeException{
		
		if(benutzername.isEmpty()){
			
			throw new EingabeException("Bitte Benutzernamen eingeben!");
			
		}else if(passwort.isEmpty()){
			
			throw new EingabeException("Bitte Passwort eingeben!");
			
		}else if((ueberpruefeBenutzer()) == false){
			
			throw new EingabeException("Passwort oder Benutzername Falsch!");
			
		}else {
			
			return true;
		}
	}

	private boolean ueberpruefeBenutzer(){
		/*
		 * Es wird geprüft ob die eingegebenen Daten
		 * in der Datenbank vorhanden sind.
		 * Dies geschieht mit Hilfe einer Exception
		 * ist das ergebnis was das Query liefer null
		 * so wird bei der zuweisung eine Exception geworfen
		 */
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("chilidatenbank");
		EntityManager em = factory.createEntityManager();
		
		Query q = em.createQuery("SELECT m FROM Mitarbeiter m WHERE m.benutzername =:benutzername AND m.passwort =:passwort");
			  q.setParameter("benutzername", benutzername);
			  q.setParameter("passwort", passwort);
		
		Mitarbeiter mitarbeiter;
	    
		try{
			
	    	mitarbeiter = (Mitarbeiter) q.getSingleResult();
	    	
	    }catch(NoResultException e){
	    	
	    	System.out.println("Passwort oder Benutzername Falsch!");
			em.close();
			return false;
	    }
			em.close();
			System.out.println("Eingeloggt als: "+mitarbeiter.getBenutzername());
			return true;
	}
}
